package com.whosly.disclosure.early.handler;

import com.whosly.disclosure.early.handler.spi.ErrorHandler;
import com.whosly.disclosure.early.handler.spi.exception.ConfigurationException;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.ServiceLoader;

/**
 * error handler factory.
 *
 * @author fengyang <deep_blue_yang@126.com>
 * @date 2020-10-09  13:14
 * @title: ErrorHandlerFactory
 */
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class ErrorHandlerFactory {

    private static final Map<String, ErrorHandler> HANDLERS = new LinkedHashMap<>();

    private static final String DEFAULT_HANDLER = ErrorGeneralHandlerType.LOG.name();

    static {
        // 每次 ServiceLoader.load 都会获取到一次实例。
        for (ErrorHandler each : ServiceLoader.load(ErrorHandler.class)) {
            // 加入本地缓存中，便于后续直接使用
            HANDLERS.put(each.getType(), each);
        }
    }

    /**
     * Get error handler.
     *
     * @param type error handler type
     * @return error handler
     */
    public static ErrorHandler getHandler(final ErrorGeneralHandlerType type) {
        if (type == null) {
            return HANDLERS.get(DEFAULT_HANDLER);
        }
        if (!HANDLERS.containsKey(type.name())) {
            throw new ConfigurationException("Can not find error handler type '%s'.", type);
        }
        return HANDLERS.get(type.name());
    }

}
